﻿/*******************************************************************************
 * @file zporting.c
 * @brief libzmodem 移植相关
 *******************************************************************************
*/

#include "zporting.h"
#include "stm32f10x.h"
#include "flash.h"

static struct stat g_rcv_st;

int fstat(int fd, struct stat *statbuf)
{
    *statbuf = g_rcv_st;
    return 0;
}

/**
 * @note 请确保 size 除了最后一次外，都为2的倍数。
 * 		 如果不能确保，那么请做相应处理，因为flash需按16bit写入。
 *		 同时，stream 也要2字节对齐
 */
size_t fwrite2(const void *ptr, size_t size, size_t nmemb,
              FILE *stream)
{
    if(Flash_Write((uint32_t)stream, (uint16_t *)ptr, size) != 0)
    {
        return 0;
    }

    g_rcv_st.offset += size;
    g_rcv_st.st_size += size;
    return size;
}

int putc2(int c, FILE *stream)
{
    g_rcv_st.datas[g_rcv_st.offset++] = c;
    g_rcv_st.st_size = g_rcv_st.offset;
    return c;
}

void putdatas(const char *data, size_t len)
{
    while(len--)
    {
        while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
        USART_SendData(USART1, (uint8_t)*data++);
    }
}
